package com.tedu.API.ee;

import org.apache.commons.imaging.ImageFormats;
import org.apache.commons.imaging.ImageReadException;
import org.apache.commons.imaging.ImageWriteException;
import org.apache.commons.imaging.Imaging;
import org.junit.Test;

import java.awt.image.BufferedImage;
import java.io.*;
import java.util.*;

/**
 * 流---传输数据---传输数据过程中绝对不能出错【处理手段】
 * 标准流结合异常---标准IO
 *
 * 异常
 * Java面向对象语言，程序中出现的所有错误，定义为对象【处理对应错误】
 *
 * Throwable顶级异常超类
 *
 * Exception异常：描述程序级别的错误---有解决方案
 *              编译期：---RunTimeException异常表示类---
 *                     FileOutputStream创建对象---波浪线---抛出方法之外
 *              检查异常：通常编译器检查处理，程序直接报错，抛出
 *              解决方案：①捕获异常（*）
 *                      ②抛出异常---抛出方法之外---打印控制台
 *
 *              运行期：控制台直接显示异常对象【异常对象的名字，产生原因】
 *              非检查异常：控制台输出异常对象名称，RunTimeException异常表示类
 *
 *              最后了解【throw与throws---RunTimeException】
 *
 * Error错误：描述系统级别的错误---出现---程序宕机
 *          概率非常低--->递归：自己调自己【方法】--->
 */
public class EE {
    /**
     * Error  错误---程序严重错误
     * 模拟：方法调方法---栈溢出错误
     * StackOverflowError栈溢出错误
     * ----程序宕机----后台：9亿账号
     * while(true){
     * 拼接字符串对象
     * }
     */
    public static void method() {
        method();
    }

    @Test
    public void testError() {
        EE.method();
    }

    /**
     * Exception异常：检查异常【出现编译期】---代码报波浪线
     * 两种处理手段：①捕获异常---产生异常原因
     * 语法：try{
     * 怀疑代码可能有异常或者提示异常
     * }catch(小异常名字 e){
     * e.printStacktrace();打印异常信息
     * }catch(中异常名字 e){
     * e.printStacktrace();打印异常信息
     * }catch(大异常名字 e){  Exception
     * e.printStacktrace();打印异常信息
     * }finally{
     * 一定执行的代码块
     * }
     * 快捷键：ctrl+alt+T
     * ②抛出异常   throws  异常的名字【并未解决】
     * 考试题：throw与throws的区别？
     * 异常关键字：throw
     * throws
     * 非检查异常【出现运行异常】---代码无错误---控制台
     * ----------------------------------
     * 异常：FileNotFoundException   文件不存在异常
     * 产生原因：路径写错、文件名写错
     * 异常：NullPointerException
     * 产生原因：获取字符串为空，数组：值为空，集合：元素为空[存在null值】
     * 异常：StringIndexOutOfBoundsException  字符串下标越界异常
     * 产生原因：字符串下标没有对应的字符
     * 异常：NumberFormatException  数字转换异常
     * 产生原因：字符串不是正确的类型
     */
    @Test
    public void testException() throws FileNotFoundException {
        //检查异常【出现编译期】---代码报波浪线
//        FileOutputStream fis=new FileOutputStream("");
        //非检查异常【出现运行期】---控制台
        try {
            String str = "a";
            str.length();
            str.charAt(1);
            Integer.parseInt(str);//解析字符串---转换为对应类型
        } catch (StringIndexOutOfBoundsException e) {
            e.printStackTrace();//打印异常对象的信息
            System.out.println("字符串小异常：下标越界异常");
        } catch (NumberFormatException e) {
            e.printStackTrace();//打印异常信息
            System.out.println("字符串小异常");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("大异常");
        } finally {
            System.out.println("一定会执行的代码块");
        }
    }


    /**
     * 作业1：写出5个【非检查】异常的代码示例
     * 提示：查API---Java.lang.异常
     * 字符串、包装类、集合、IO流
     */
    @Test
    public void testHomeWork1() throws ImageWriteException, IOException, ImageReadException {
      //①
        File file=new File("1.png");
        BufferedImage bi= Imaging.getBufferedImage(file);
        File desc=new File("ma.png");
        Imaging.writeImage(bi,desc, ImageFormats.DCX,null);
        System.out.println("写出成功~~");
      //②
        FileInputStream fis=new FileInputStream("E:\\javaapi\\API\\src\\main\\java\\com\\tedu\\API\\io");
        InputStreamReader isr=new InputStreamReader(fis);
        BufferedReader br=new BufferedReader(isr);
        String line=null;
        while ((line=br.readLine())!=null){
            System.out.println("打印读到字符串："+line);
        }
        fis.close();
      //③
        File file1=new File("1.png");
        BufferedImage bi1=Imaging.getBufferedImage(file1);
        //2.写出图片的路径+全称
        File desc1=new File("ma.png");
        //3.Imaging类---调用静态方法
        //ImageFormats 类
        //version1 ImageFormat.format("png");指定图片格式
        //version2 ImageFormat.PNG  静态常量属性
        Imaging.writeImage(bi1,desc1, ImageFormats.PNG,null);
        System.out.println("写出成功~~");
      //④
        FileInputStream fis1=new FileInputStream("1.mp4");
        FileOutputStream fos=new FileOutputStream("新文件.mp4");
        int len=-1;
        while((len=fis1.read())!=-1){
            fos.write(len);
        }
        fis1.close();
        fos.close();
      //⑤
        Collection<String> a=new ArrayList();
        a.add("十月一");a.add("春节");a.add("元旦");a.add("元宵");
        Iterator<String> it=a.iterator();
        while (it.hasNext()){
            String i=it.next();
            if ("十月一".equals(i)){
                a.remove(i);
            }
        }
        System.out.println("打印集合："+a);
        }

}

